//
//  TTILogger.m
//  DanoneEA
//
//  Created by Senela on 16/12/9.
//  Copyright © 2016年 翔傲科技. All rights reserved.
//

#import "TTILogger.h"

#define Notify_WillResignActive @"UIApplicationWillResignActiveNotification"

#define Interval   60
#define Threshold  20

@implementation TTILogger

- (instancetype)init {
    self = [super init];
    if (self) {
        self.deleteInterval = 0;
        self.maxAge = 0;
        self.deleteOnEverySave = NO;
        self.saveInterval = Interval;
        self.saveThreshold = Threshold;
        
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(saveOnSuspend)
                                                     name:Notify_WillResignActive
                                                   object:nil];
        
    }
    return self;
}


- (void)saveOnSuspend {
    dispatch_async(_loggerQueue, ^{
        [self db_save];
    });
}

/*
 每次打 log 时，db_log: 会被调用，我们在这个函数里，将 log 发给 formatter，将返回的 log 消息体字符串保存在缓冲中。 
 db_log 的返回值告诉 DDLog 该条 log 是否成功保存进缓存。
 */
- (BOOL)db_log:(DDLogMessage *)logMessage
{
    if (!_logFormatter) {
        //没有指定 formatter
        return NO;
    }
    
    if (!_logMessagesArray)
        _logMessagesArray = [NSMutableArray arrayWithCapacity:Threshold]; // 我们的saveThreshold只有20，所以一般情况下够了
    
    if ([_logMessagesArray count] > 2000) {
        // 如果段时间内进入大量log，并且迟迟发不到服务器上，我们可以判断哪里出了问题，在这之后的 log 暂时不处理了。
        // 但我们依然要告诉 DDLog 这个存进去了。
        return YES;
    }
    
    //利用 formatter 得到消息字符串，添加到缓存
    [_logMessagesArray addObject:[_logFormatter formatLogMessage:logMessage]];
    return YES;
}

/*
 当1分钟或者未写入 log 数达到 Threshold 时， db_save 就会被调用，我们在这里，将缓存的数据上传到自己的服务器
 */
- (void)db_save{
    
    //判断是否在 logger 自己的GCD队列中
    if (![self isOnInternalLoggerQueue])
        NSAssert(NO, @"db_saveAndDelete should only be executed on the internalLoggerQueue thread, if you're seeing this, your doing it wrong.");
    
    //到达一分钟时，如果缓存内没数据，不作处理
    if ([_logMessagesArray count] == 0)
        return;
    
    // 获取缓存中所有数据，之后将缓存清空
    NSArray *oldLogMessagesArray = [_logMessagesArray copy];
    _logMessagesArray = [NSMutableArray arrayWithCapacity:0];
    
    //用换行符，把所有的数据拼成一个大字符串
    NSString *logMessagesString = [oldLogMessagesArray componentsJoinedByString:@"\n"];
    
    [self post:logMessagesString];
    
}


-(void)post:(NSString *)messageString
{
    //TODO:完成上传功能
    DDLogInfo(@"向服务器上传本地日志");
}

@end
